sequenceDiagram
    actor ZXS as 咨询师
    participant SCRM-F AS SCRM（前端）
    participant SCRM-B AS SCRM（后端）
    # participant EMS AS 老EMS
    participant NEMS-F AS 新EMS（前端）
    participant KC as OAuth-Keycloak
    participant OAPI as OpenAPI网关
    participant NEMS-B AS 新EMS（后端）

    ZXS ->> SCRM-F: 立即报名
    SCRM-F ->>+ SCRM-B: 立即报名：客户ID
    SCRM-B ->> SCRM-B: 确认是否在灰度范围内（根据当前用户判断，不在时直接返回原报名地址）
    SCRM-B ->> SCRM-B: 获取新EMS订单所需的业务参数（客户信息、来源、业务线、操作人等）

    SCRM-B ->> SCRM-B: 获取OAPI对应KC颁发的ClientID、SecretKey
    SCRM-B ->>+ KC: 获取OAPI-KC-TOKEN（ClientID、SecretKey）
    KC --)- SCRM-B: 返回OAPI-KC-TOKEN

    SCRM-B ->>+ OAPI: 创建报名（业务参数、OAPI-KC-TOKEN）
    OAPI ->> OAPI: 验证OAPI-KC-TOKEN
    OAPI ->>+ NEMS-B: 请求创建报名
    NEMS-B ->> NEMS-B: 生成SID（有效期1小时）
    NEMS-B ->> NEMS-B: 保存相关参数（K：SID，V：所有业务参数）
    NEMS-B ->> NEMS-B: 拼装前端报名页面地址（含业务参数、SID）
    NEMS-B --)- OAPI: 返回前端报名页面地址
    OAPI --)- SCRM-B: 返回前端报名页面地址

    SCRM-B --)- SCRM-F: 返回新EMS报名页面链接

    SCRM-F ->>+ NEMS-F: 重定向新EMS报名链接（sid，不含业务参数）

    NEMS-F ->>+ OAPI: 通过sid获取相关业务参数（sid）
    OAPI ->> OAPI: 跳过此接口认证
    OAPI ->>+ NEMS-B: 通过sid获取相关业务参数（sid）
    NEMS-B ->> NEMS-B: 通过sid获取所有业务参数（失败则直接返回401）
    NEMS-B ->>+ KC: 获取新的OAPI-KC-TOKEN（ClientID、SecretKey）
    KC --)- NEMS-B: 返回新的OAPI-KC-TOKEN
    NEMS-B --)- OAPI: 返回业务参数、OAPI-KC-TOKEN
    OAPI --)- NEMS-F: 返回业务参数、OAPI-KC-TOKEN
    NEMS-F --)- ZXS: 显示报名页面

    NEMS-F ->>+ OAPI: 获取校区列表（OAPI-KC-TOKEN）
    OAPI ->>+ NEMS-B: 获取校区列表
    NEMS-B --)- OAPI: 校区列表
    OAPI --)- NEMS-F: 校区列表

    NEMS-F ->>+ OAPI: 获取付款方式列表（OAPI-KC-TOKEN）
    OAPI ->>+ NEMS-B: 获取付款方式列表
    NEMS-B --)- OAPI: 付款方式列表
    OAPI --)- NEMS-F: 付款方式列表
